package com.qq.open.qzone.topic;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.log4j.Logger;

import com.qq.open.common.OpenQqConstants;
import com.qq.open.common.OpenQqUtils;
import com.qq.open.common.json.JSONException;
import com.qq.open.common.json.JSONObject;
import com.qq.open.qzone.bean.param.QqAddTopicParamBean;
import com.qq.open.qzone.bean.result.QqAddTopicResultBean;

/**
 * 登录用户发布心情
 *    发布以后，将在QQ空间的说说下添加一条动态，以分享给好友。
 * @author HaoLiang
 *
 */
public class QqAddTopic {
	
	/** QQ互联工具类 */
	private OpenQqUtils oqu = new OpenQqUtils();

	/** 日志 */
	private Logger log = Logger.getLogger(QqAddTopic.class);
	
	/**
	 * 发布心情
	 * 
	 * @param addTopicBean 参数
	 * @return 接口返回Bean
	 * @throws IOException
	 * @throws JSONException
	 */
	public QqAddTopicResultBean addTopic(QqAddTopicParamBean addTopicBean) throws IOException, JSONException {
		// 日志
		log.info("发布心情 开始...");
		
		// 请求接口，获取发布心情结果
		String jsonData = oqu.doPost(OpenQqConstants.QQ_ADD_TOPIC_URL,this.getAddTopicParam(addTopicBean));
		
		// 接口数据
		QqAddTopicResultBean resultBean = this.jsonToBean(jsonData);
		
		// 日志
		log.info("发布心情 开始...");
		
		return resultBean;
	}
	
	
	/**
	 * 封装Post请求参数
	 * 
	 * @param addTopicBean 参数
	 * @return  Post请求参数
	 * @throws UnsupportedEncodingException
	 */
	private MultipartEntity getAddTopicParam(QqAddTopicParamBean addTopicBean) throws UnsupportedEncodingException {
		MultipartEntity reqEntity = new MultipartEntity();
		// AccessToken
		reqEntity.addPart("access_token", new StringBody(addTopicBean
				.getAccessToken()));
		
		// AppId
		reqEntity.addPart("oauth_consumer_key", new StringBody(oqu.getConfigValue("qq.appid")));
		
		// OpenId
		reqEntity.addPart("openid", new StringBody(addTopicBean.getOpenId()));
		
		// 定义API返回的数据格式
		reqEntity.addPart("format", new StringBody("json"));
		
		// 发布的心情的内容
		reqEntity.addPart("con", new StringBody(addTopicBean.getCon(), Charset.forName("UTF-8")));
		
		// 发布心情时引用的信息的类型
		if (addTopicBean.getRichtype() > 0) {
			// 1表示图片； 2表示网页； 3表示视频
			reqEntity.addPart("richtype", new StringBody(String.valueOf(addTopicBean.getRichtype())));
		}
		
		// 发布心情时引用的信息的值
		if (oqu.isNotNull(addTopicBean.getRichval())) {
			reqEntity.addPart("richval", new StringBody(addTopicBean.getRichval()));
		}
		
		// 发布心情时引用的地址
		if (oqu.isNotNull(addTopicBean.getLbsNm())) {
			reqEntity.addPart("lbs_nm", new StringBody(addTopicBean.getLbsNm()));
		}
		
		// 发布心情时引用的经度
		if (oqu.isNotNull(addTopicBean.getLbsX())) {
			reqEntity.addPart("lbs_x", new StringBody(addTopicBean.getLbsX()));
		}
		
		// 发布心情时引用的纬度
		if (oqu.isNotNull(addTopicBean.getLbsY())) {
			reqEntity.addPart("lbs_y", new StringBody(addTopicBean.getLbsY()));
		}
		
		// 第三方应用的平台类型
		if (oqu.isNotNull(addTopicBean.getLbsY())) {
			// 1表示QQ空间； 2表示腾讯朋友； 3表示腾讯微博平台； 4表示腾讯Q+平台
			reqEntity.addPart("third_source", new StringBody(addTopicBean.getThirdSource()));
		}
		
		return reqEntity;
	}
	
	
	/**
	 * json数据转换成javaBean
	 * 
	 * @param jsonData 接口返回的数据
	 * @return javaBean
	 * @throws JSONException 
	 */
	private QqAddTopicResultBean jsonToBean(String jsonData) throws JSONException {
		QqAddTopicResultBean resultBean = new QqAddTopicResultBean();
		
		JSONObject jsonObjRoot;
		try {
			jsonObjRoot = new JSONObject(jsonData);
			
			// 接口返回错误的场合
			if (jsonObjRoot.getInt("ret") != 0) {
				// 设置错误标识为真
				resultBean.setErrorFlg(true);
				// 设置错误编号
				resultBean.setErrorCode(jsonObjRoot.get("errcode").toString());
				// 设置错误内容
				resultBean.setErrorMes(jsonObjRoot.getString("msg"));
			} 
		} catch (JSONException e) {
			e.printStackTrace();
			// 日志
			log.error("addTopic 异常，json数据是：" + jsonData);
			throw e;
		}
		
		return resultBean;
	}
}
